/**
 * 练习
 *       具体要求：
 *         生成54张扑克牌（13个数字*4种花色，再加大小王2张）
 *         洗牌：将54张牌随机打乱
 *         准备三个玩家，三人交替摸牌，最后三张底牌不能摸
 *         查看三人各自手中的牌和底牌，要求按牌的大小顺序展示
 *       提示：
 *         需要几个集合，分别保存什么样的数据？
 *         花色信息、点数信息、组合好的牌放在什么地方
 *         如何比较每张牌的大小，相同数值的牌如何比较大小？
 *         给牌添加对应的权重值
 *         洗牌需要用什么方法才能将集合中的元素顺序打乱？
 *         如何发牌，有什么注意事项？
 *       dipai: [♣6, ♦6, ♦9]
 *       player1: [♦3, ♥4, ♠4, ♥5, ♠6, ♠8, ♥8, ♣9, ♥9, ♥J, ♣J, ♦J, ♠Q,♠K, ♦K, ♣K, 小王]
 *       player2: [♠3, ♦4, ♣5, ♥6, ♠7, ♣7, ♦7, ♣8, ♠9, ♦10, ♦Q, ♥Q, ♥K,♥A, ♣2, ♥2, 大王]
 *       player3: [♥3, ♣3, ♣4, ♠5, ♦5, ♥7, ♦8, ♥10, ♠10, ♣10, ♠J, ♣Q,♠A, ♦A, ♣A, ♦2, ♠2]
 */
import java.util.*;

public class Test1 {
    public static void main(String[] args) {
        // 1. 生成54张扑克牌
        List<Card> poker = generatePoker();
        System.out.println("生成的扑克牌数量: " + poker.size() + "张");

        // 2. 洗牌
        shufflePoker(poker);

        // 3. 准备玩家和底牌
        List<Card> player1 = new ArrayList<>();
        List<Card> player2 = new ArrayList<>();
        List<Card> player3 = new ArrayList<>();
        List<Card> bottomCards = new ArrayList<>();

        // 4. 发牌
        dealPoker(poker, player1, player2, player3, bottomCards);

        // 5. 排序
        sortCards(player1, player2, player3, bottomCards);

        // 6. 展示结果
        showResult(player1, player2, player3, bottomCards);
    }

    // 生成54张扑克牌
    private static List<Card> generatePoker() {
        List<Card> poker = new ArrayList<>();

        // 定义花色
        String[] suits = {"♠", "♥", "♦", "♣"};
        // 定义点数和对应的权重
        String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        int[] weights = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

        // 生成13个数字*4种花色的52张牌
        for (int i = 0; i < ranks.length; i++) {
            for (String suit : suits) {
                poker.add(new Card(suit, ranks[i], weights[i]));
            }
        }

        // 添加大小王
        poker.add(new Card("", "小王", 14));
        poker.add(new Card("", "大王", 15));

        return poker;
    }

    // 洗牌
    private static void shufflePoker(List<Card> poker) {
        Collections.shuffle(poker);
    }

    // 发牌：三人交替摸牌，最后三张作为底牌
    private static void dealPoker(List<Card> poker, List<Card> p1, List<Card> p2, List<Card> p3, List<Card> bottom) {
        // 前51张牌发给三个玩家，每人17张
        for (int i = 0; i < poker.size() - 3; i++) {
            Card card = poker.get(i);
            switch (i % 3) {
                case 0:
                    p1.add(card);
                    break;
                case 1:
                    p2.add(card);
                    break;
                case 2:
                    p3.add(card);
                    break;
            }
        }

        // 最后三张作为底牌
        for (int i = poker.size() - 3; i < poker.size(); i++) {
            bottom.add(poker.get(i));
        }
    }

    // 对所有牌进行排序
    private static void sortCards(List<Card> p1, List<Card> p2, List<Card> p3, List<Card> bottom) {
        Collections.sort(p1);
        Collections.sort(p2);
        Collections.sort(p3);
        Collections.sort(bottom);
    }

    // 展示结果
    private static void showResult(List<Card> p1, List<Card> p2, List<Card> p3, List<Card> bottom) {
        System.out.println("底牌: " + bottom);
        System.out.println("player1: " + p1);
        System.out.println("player2: " + p2);
        System.out.println("player3: " + p3);
    }
}
